js 改写对象(包括方法)转字符串
对象转字符串字符串转对象总结
js中将对象转化为字符串可以用JSON.stringify,字符串转对象可以用JSON.parse。这两个方法在大部分的情况下都很好用,但是这两个方法在进行字符串转换的时候,会丢失对象中的方法。我们有时候会想要保留对象中的方法,这就需要进行一些额外的操作。
对象转字符串
对象转字符串要保留函数的思路是将对象中的函数转化为字符串,然后再调用JSON.stringify将更改过的对象转化为字符串。方法如下:
// 返回一个将对象中的函数都转化为字符串的对象 不直接在原对象上面改
function stringifyFunction(obj){
let newobj = JSON.parse(JSON.stringify(obj))
for(let key in obj){
if(obj[key] instanceof Function){
newobj[key] = obj[key].toString().replace(/[\n\t]/g,"");
continue;
}
if(obj[key] instanceof Object){
newobj[key] = stringifyFunction(obj[key]);
}
}
return newobj;
}
function objectToString(obj){ // 用于替代JSON.stringify函数
let _object = stringifyFunction(obj); // 将对象中的函数转为字符串
return JSON.stringify(_object) // 将对象转为字符串
}
字符串转对象
思路主要是先用JSON.parse将字符串转为对象,然后使用正则表达式匹配对象中的属性,找出函数字符串使用Function对象转为函数。方法如下:
function stringToFunction(obj){ // 将对象中的函数字符串转化为函数
var regex = /^((function\s)|.)([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)\s\{.*\}/ //匹配函数字符串
for(let key in obj){
if(obj[key] instanceof Object){
stringToFunction(obj[key]);
}else{
if(regex.test(obj[key])){ // 是一个函数
try{
let params = obj[key].substring(obj[key].indexOf('(')+1,obj[key].indexOf(')'));
let operation = obj[key].substring(obj[key].indexOf("{")+1,obj[key].length-1);
obj[key] = new Function(params, operation);
}catch(e){
console.log(e)
}
}
}
}
return obj
}
function stringToObject(string){ // 用于替代JSON.parse
let obj = JSON.parse(string); //将字符串转为对象
return stringToFunction(obj) // 将对象中的函数字符串转为函数
}
总结
修改以后的两个函数在对象没有方法的时候,与原本的JSON.stringify以及JSON.parse是一样的,仅单独对属性为方法的情况进行处理。
|